import axios from "axios";
import { handleTokenRefresh, TOKEN_CONFIG } from './tokenRefresh.js';
import { useAuthStore } from '@/stores/auth';

// 是否启用自动刷新token功能
const ENABLE_TOKEN_REFRESH = true; // 设置为false可禁用自动刷新功能


//1. 创建新的axios实例，
const service = axios.create({
    baseURL: import.meta.env.VUE_APP_API_URL || '/api',
    timeout: 15 * 1000
})


// 2.请求拦截器
service.interceptors.request.use(config => {
    //发请求前做的一些处理，数据转化，配置请求头，设置token,设置loading等，根据需求去添加

    // 如果是FormData类型的数据，不要进行JSON转换
    if (!(config.data instanceof FormData)) {
        config.data = JSON.stringify(config.data); //数据转化,也可以使用qs转换
        config.headers = {
            'Content-Type': 'application/json'//配置请求头
        }
    }
    
    // 获取token（从持久化的 Pinia store 读取）
    const auth = useAuthStore()
    const access_token = auth.access

    if (access_token) {
        config.headers[TOKEN_CONFIG.TOKEN_HEADER] = TOKEN_CONFIG.TOKEN_PREFIX + access_token;
    }
    
    return config
}, error => {

    Promise.reject(error)
})


// 3.响应拦截器
service.interceptors.response.use(response => {
    // 如果响应中包含token，保存到持久化的 Pinia store
    try {
        const auth = useAuthStore()
        const nextAccess = response?.data?.data?.[TOKEN_CONFIG.RESPONSE_TOKEN_FIELD]
        const nextRefresh = response?.data?.data?.[TOKEN_CONFIG.RESPONSE_REFRESH_TOKEN_FIELD]
        if (typeof nextAccess === 'string' && nextAccess) {
            auth.setTokens({ access: nextAccess })
        }
        if (typeof nextRefresh === 'string' && nextRefresh) {
            auth.setTokens({ refresh: nextRefresh })
        }
    } catch (_) {
        // 忽略 store 写入异常，保持响应原样返回
    }
    return response.data;
}, error => {
    /***** 接收到异常响应的处理开始 *****/
    if (error && error.response) {
        // console.log(error);
        
        const statusCode = parseInt(error.response.status);
        // const statusCode = parseInt(error.message);
        // 1.公共错误处理
        // 2.根据响应码具体处理
        switch (statusCode) {

            case 400:
                error.message = '错误请求'
                break;
            case 401:
                // 处理401未授权错误
                if (ENABLE_TOKEN_REFRESH) {
                    // 启用自动刷新token功能
                    return handleTokenRefresh(error, service);
                } else {
                    // 禁用自动刷新，直接提示错误
                    error.message = '未授权，无权限访问该资源';
                }
                break;
            case 403:
                error.message = '拒绝访问'
                break;
            case 404:
                error.message = '请求错误,未找到该资源'
                // window.location.href = "/NotFound"
                break;
            case 405:
                error.message = '请求方法未允许'
                break;
            case 408:
                error.message = '请求超时'
                break;
            case 500:
                error.message = '服务器端出错'
                break;
            case 501:
                error.message = '网络未实现'
                break;
            case 502:
                error.message = '网络错误'
                break;
            case 503:
                error.message = '服务不可用'
                break;
            case 504:
                error.message = '网络超时'
                break;
            case 505:
                error.message = 'http版本不支持该请求'
                break;
            default:
                error.message = `连接错误${error.response.status}`


        }

        // 3.如果后端返回 message，则优先使用后端的 message 文案
        try {
            const serverMessage = error?.response?.data?.message;
            if (serverMessage) {
                error.message = serverMessage;
            }
        } catch (_) {
            // 忽略解析异常，使用上方预设 message
        }

    } else {

        // 超时处理
        if (JSON.stringify(error).includes('timeout')) {


        }
        error.message = '连接服务器失败'
    }

    return Promise.reject(new Error(error.message || '请求失败'));
    /***** 处理结束 *****/
    //如果不需要错误处理，以上的处理过程都可省略


    // 清除所有本地存储数据
    // localStorage.clear();

    // return Promise.resolve(error.response)
})




//4.导入文件
export default service